package cn.qingyun.gis.modules.express.util;

import cn.hutool.core.util.CharsetUtil;
import cn.hutool.crypto.Mode;
import cn.hutool.crypto.Padding;
import cn.hutool.crypto.digest.DigestUtil;
import cn.hutool.crypto.symmetric.AES;

import java.nio.charset.Charset;

/**
 * @author WeiXiang
 * @Description ：加密工具类，主要封装AES加密，与MD5加密
 * @date 2021-04-12
 */
public class EncryptionUtil {

    /**
     * AES加密
     *
     * @param context 明文
     * @param key     AES密钥
     * @return 加密后数据 （hex格式）
     */
    public static String AESEncryptionHex(String context, String key) {

        AES aes = new AES(Mode.CBC, Padding.PKCS5Padding, key.getBytes());

        return aes.encryptHex(context, CharsetUtil.CHARSET_UTF_8);
    }


    /**
     * AES加密
     *
     * @param context 明文
     * @param key     AES密钥
     * @param iv      AES偏移量
     * @return 加密后数据 （hex格式）
     */
    public static String AESEncryptionHex(String context, String key, String iv) {

        AES aes = new AES(Mode.CBC, Padding.PKCS5Padding, key.getBytes(), iv.getBytes());

        return aes.encryptHex(context, CharsetUtil.CHARSET_UTF_8);
    }


    /**
     * AES加密不包含偏移量
     *
     * @param context 明文
     * @param key     AES密钥
     * @return 加密后数据 （base64格式）
     */
    public static String AESEncryptionBase64(String context, String key) {

        AES aes = new AES(Mode.CBC, Padding.PKCS5Padding, key.getBytes());

        return aes.encryptBase64(context, CharsetUtil.CHARSET_UTF_8);
    }

    /**
     * AES加密
     *
     * @param context 明文
     * @param key     AES密钥
     * @param iv      AES偏移量
     * @return 加密后数据 （base64格式）
     */
    public static String AESEncryptionBase64(String context, String key, String iv) {

        AES aes = new AES(Mode.CBC, Padding.PKCS5Padding, key.getBytes(), iv.getBytes());

        return aes.encryptBase64(context, CharsetUtil.CHARSET_UTF_8);
    }


    /**
     * AES解密
     *
     * @param ciphertext 密文
     * @param key        密钥
     * @return 解密后数据 (UTF-8格式)
     */
    public static String AESDecrypt(String ciphertext, String key) {

        AES aes = new AES(Mode.CBC, Padding.PKCS5Padding, key.getBytes());

        return aes.decryptStr(ciphertext, CharsetUtil.CHARSET_UTF_8);
    }

    /**
     * AES解密
     *
     * @param ciphertext 密文
     * @param key        密钥
     * @param iv         偏移量
     * @return 解密后数据 (UTF-8格式)
     */
    public static String AESDecrypt(String ciphertext, String key, String iv) {

        AES aes = new AES(Mode.CBC, Padding.PKCS5Padding, key.getBytes(), iv.getBytes());

        return aes.decryptStr(ciphertext, CharsetUtil.CHARSET_UTF_8);
    }


    /**
     * MD5加密
     * 默认 UTF-8 格式加密
     *
     * @param context 明文
     * @return MD5加密
     */
    public static String MD5Encryption(String context) {
        return DigestUtil.md5Hex(context);
    }


    /**
     * MD5加密
     * 自定义格式，格式来源 CharsetUtil
     *
     * @param context 明文
     * @param charset 加密格式，可知指定GBK或者UTF-8
     * @return MD5加密
     */
    public static String MD5Encryption(String context, Charset charset) {
        return DigestUtil.md5Hex(context, charset);
    }
}
